 #define _CRT_SECURE_NO_WARNINGS 1

class Solution {
public:
    unordered_map<char, int> val_map = {
        {'I', 1},
        {'V', 5},
        {'X', 10},
        {'L', 50},
        {'C', 100},
        {'D', 500},
        {'M', 1000},
    };
    int romanToInt(string s) {
        int ret = 0;
        int n = s.size();
        for (int i = 0; i < n; i++) {
            int val = val_map[s[i]];
            if (i < n - 1 && val < val_map[s[i + 1]]) {
                ret -= val;
            }
            else {
                ret += val;
            }
        }
        return ret;
    }
};

class Solution {
public:
    string intToRoman(int num) {
        // int vals[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        // string chs[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

        // string res;
        // for(int i = 0; i < 13; i++)
        // {
        //     while(num >= vals[i])
        //     {
        //         num -= vals[i];
        //         res += chs[i];
        //     }
        // }
        // return res;

        const string table[4][10] = { // 1~9
                           {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
                           // 10~90
                          {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
                          // 100~900
                         {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
                         // 1000~3000
                        {"", "M", "MM", "MMM"}
        };
        return table[3][num / 1000] + table[2][num % 1000 / 100] + table[1][num % 100 / 10] + table[0][num % 10];
    }
};

class Solution {
public:
    int lengthOfLastWord(string s) {
        int cur = s.size() - 1;

        while (s[cur] == ' ')
            cur--;

        int len = 0;
        while (cur >= 0 && s[cur] != ' ') {
            cur--;
            len++;
        }

        return len;
    }
};